package com.chenjim.glrecorder.util;

import android.annotation.SuppressLint;
import android.media.MediaCodec;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class CommonUtils {
    public static String formatTime(long currentTime) {
        //日期格式类：定义你需要的日期格式
        @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HH.mm.ss");
        //当前时间毫秒数转换为日期
        Date date = new Date(currentTime);
        return simpleDateFormat.format(date);
    }

    public static boolean isH264(byte[] data) {
        // 检查数据长度是否足够
        if (data.length < 5) {
            return false;
        }

        // 检查是否有 H.264 的起始码 (0x00000001 or 0x000001)
        if ((data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0x01) ||
                (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01)) {

            // 获取 NALU 类型
            int nalUnitType = data[4] & 0x1F;

            // 检查 NALU 类型是否在 H.264 的有效范围内 (1-23, 7 为 SPS, 8 为 PPS)
            return nalUnitType == 8; // 这是有效的 H.264 数据
        }

        return false;
    }

    public static boolean isIFrame(byte[] data) {
        // 检查数据长度是否足够
        if (data.length < 5) {
            return false;
        }

        // 检查是否有 H.264 的起始码 (0x00000001 or 0x000001)
        if ((data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0x01) ||
                (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01)) {

            // 获取 NALU 类型
            int nalUnitType = data[4] & 0x1F;

            // 检查 NALU 类型是否在 H.264 的有效范围内 (1-23, 7 为 SPS, 8 为 PPS)
            return nalUnitType == 5; // 这是有效的 H.264 数据
        }

        return false;
    }


    public void writeBytes(byte[] array) {
        FileOutputStream writer = null;
        try {
            // 打开一个写文件器，构造函数中的第二个参数true表示以追加形式写文件
            writer = new FileOutputStream(Environment.getExternalStorageDirectory() + "/1/codec_2.h264", true);
            writer.write(array);
            writer.write('\n');
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void writeToFile(MediaCodec.BufferInfo bufferInfo, ByteBuffer outputBuffer) {
        byte[] ba = new byte[bufferInfo.size];
        outputBuffer.get(ba);
        /*writeBytes(ba);*/
        Log.i("mMediaCodec===>", "ba=" + Arrays.toString(ba));
        if (ba[0] == 0 && ba[1] == 0 && ba[2] == 0 && ba[3] == 1 && ba[4] == 0x67) {
            // Log.i("mMediaCodec", "是pps");
        } else {
            // Log.i("mMediaCodec", "是视频帧");
        }
        /* if (isH264(ba)) {}*/
    }


    private BufferedOutputStream createFile(String path) {
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }
        try {
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
            return outputStream;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private void sendData(ByteBuffer outputBuffer, byte[] sps_pps) {
        byte[] outData = new byte[outputBuffer.remaining()];
        outputBuffer.get(outData);

        if (CommonUtils.isIFrame(outData)) {
            byte[] iframeData = new byte[sps_pps.length + outData.length];
            System.arraycopy(sps_pps, 0, iframeData, 0, sps_pps.length);
            System.arraycopy(outData, 0, iframeData, sps_pps.length, outData.length);

            UdpSend.getInstance("192.168.5.142").sendPack(iframeData);
        } else {
            UdpSend.getInstance("192.168.5.142").sendPack(outData);
        }
    }


}
